﻿using System;
// 泛化接口支持协变和逆变类型参数。委托也具有同样的功能。
// 如果要定义一个泛化委托类型，最好按照如下准则：
//    将只用在返回值的类型参数标注为协变（out）
//    将只用在参数的类型参数标注为逆变（in）
//这样可以使协变自然地在类型之间继承关系。
namespace _090_泛化委托类型参数协变_CSharp5点0_
{
    //①下面的委托（在System命名空间中定义）支持协变：
    delegate TResult Func<out TResult>();

    //②下面的委托（在System命名空间中定义）支持逆变：
    delegate void Action<in T>(T arg);
    class Program
    {
        static string Method1() { return ""; }
        static void Method2(object obj) { }
        static void Main(string[] args)
        {
            //①允许：
            Func<string> x = Method1;
            Func<object> y = x;

            //②允许：
            Action<object> xa = Method2;
            Action<string> ya = xa;
        }
    }
}
